Intra-day seasonality on Copper futures¶

In [1]:
import yfinance as yf
In [2]:
ticker = ["HG=F"]
data = yf.download(ticker, start="2023-01-01", end="2023-04-01", interval="1h")
[*********************100%***********************]  1 of 1 completed

HG=F = copper futures

In [3]:
data["hour"] = data.index.hour
data["Deltacloseper"] = round((data.Close - data.Close.shift(1)) / data.Close.shift(1) * 100,2)
In [4]:
data
Out[4]:
Open High Low Close Adj Close Volume hour Deltacloseper
Datetime
2023-01-02 18:00:00-05:00 3.8355 3.8485 3.8305 3.8400 3.8400 1125 18 NaN
2023-01-02 19:00:00-05:00 3.8400 3.8495 3.8395 3.8460 3.8460 1004 19 0.16
2023-01-02 20:00:00-05:00 3.8465 3.8495 3.7925 3.8130 3.8130 8193 20 -0.86
2023-01-02 21:00:00-05:00 3.8135 3.8570 3.8120 3.8535 3.8535 3812 21 1.06
2023-01-02 22:00:00-05:00 3.8535 3.8655 3.8520 3.8620 3.8620 1780 22 0.22
... ... ... ... ... ... ... ... ...
2023-03-31 12:00:00-04:00 4.0900 4.1005 4.0870 4.0935 4.0935 10309 12 0.07
2023-03-31 13:00:00-04:00 4.0930 4.0955 4.0820 4.0850 4.0850 2021 13 -0.21
2023-03-31 14:00:00-04:00 4.0850 4.0890 4.0810 4.0820 4.0820 421 14 -0.07
2023-03-31 15:00:00-04:00 4.0820 4.0885 4.0805 4.0825 4.0825 724 15 0.01
2023-03-31 16:00:00-04:00 4.0825 4.0840 4.0800 4.0835 4.0835 481 16 0.02

1448 rows × 8 columns

In [5]:
hours = []

for hour in range(0,24):
    hours.append(hour)
hours
Out[5]:
[0,
 1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23]
In [6]:
seasonality_intraday = []

for hour in hours:
    seasonality_intraday.append(data[(data.hour == hour)].Deltacloseper.mean())
In [7]:
seasonality_intraday
Out[7]:
[0.010158730158730155,
 0.002063492063492062,
 -0.035079365079365085,
 0.006666666666666669,
 0.06809523809523811,
 -0.05825396825396827,
 -0.05047619047619048,
 0.02158730158730159,
 0.014603174603174604,
 0.055079365079365075,
 -0.003968253968253958,
 -0.025079365079365076,
 0.07777777777777778,
 -0.024761904761904756,
 0.04317460317460318,
 0.0217741935483871,
 -0.004193548387096775,
 0.0,
 0.03435483870967741,
 0.001269841269841271,
 -0.013174603174603176,
 -0.003174603174603174,
 -0.026349206349206348,
 -0.00492063492063492]
In [8]:
import plotly.express as px

fig = px.line(seasonality_intraday)
fig.update_layout(title = "Intra-day Seasonality",xaxis_title = "Hour",height=600,width=1000)
fig.show()